<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>类型转换</title>
</head>

<body>
  <!-- http://2ality.com/2012/01/object-plus-object.html -->
  <script type="text/javascript">
    // Number函数：转换成数值
    // 转换后还是原来的值
    console.log(Number(324)); // 324
    // 如果可以被解析为数值，则转换为相应的数值，否则得到NaN。空字符串转为0
    console.log(Number('324'));// 324
    console.log(Number('324abc')); // NaN

    console.log(Number('')); // 0
    // true转成1，false转成0
    console.log(Number(false)); // 0
    console.log(Number(true));// 1
    // 转成NaN
    console.log(Number(undefined)); // NaN
    // 转成0
    console.log(Number(null)); // 0
    var a = {a: 1};
    console.log('a', Number({a: 1}));
  </script>

  <script type="text/javascript">
    // 数值：转为相应的字符串
    console.log(String(123)); // "123"
    // 字符串：转换后还是原来的值
    console.log(String('abc')); // "abc"
    // 布尔值：true转为“true”，false转为“false”
    console.log(String(true)); // "true"
    // undefined：转为“undefined”
    console.log(String(undefined)); // "undefined"
    // null：转为“null”
    console.log(String(null)); // "null"
    // 先调用toString方法，如果toString方法返回的是原始类型的值，则对该值使用String方法;
    // 如果toString方法返回的是复合类型的值，再调用valueOf方法，如果valueOf方法返回的是原始类型的值，则对该值使用String方法
    var b = {
        b: 1,
        toString: function () {
            return {
                b: 2,
            };
        },
        valueOf: function () {
            return 'b';
        },
    };
    console.log('b', String(b));
  </script>

  <script type="text/javascript">
    // 以下六个值的转化结果为false，其他的值全部为true
    // undefined
    // null
    // -0
    // +0
    // NaN
    // ''（空字符串）
    console.log('undefined', Boolean(undefined)); // false

    console.log('null', Boolean(null)); // false

    console.log('0', Boolean(0)); // false

    console.log('NaN', Boolean(NaN)); // false

    console.log('', Boolean('')); // false
  </script>

  <script type="text/javascript">
    // 运算子之中存在对象（或者准确地说，存在非原始类型的值），
    // 则先调用该对象的valueOf方法。如果返回结果为原始类型的值，
    // 则运用上面两条规则；否则继续调用该对象的toString方法，
    // 对其返回值运用上面两条规则
    1 + [1, 2];
  </script>
</body>

</html>
